package cn.tedu.csmall.product.service;


import cn.tedu.csmall.common.ex.ServiceException;
import cn.tedu.csmall.common.web.JsonResult;
import cn.tedu.csmall.pojo.dto.CategoryAddNewDTO;
import cn.tedu.csmall.pojo.vo.CategoryDetailsVO;
import cn.tedu.csmall.pojo.vo.CategorySimpleListItemVO;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface ICategoryService {

    /**
     * 添加“类别”
     * @param categoryAddNewDTO 类别
     */
    @Transactional
    void addNew(CategoryAddNewDTO categoryAddNewDTO) throws ServiceException;

    /**
     * 根据“类别”id查询“类别”的详细信息
     *
     * @param id “类别”id
     * @return “类别”的详细信息，如果没有匹配的数据，将抛出异常
     */
    CategoryDetailsVO getDetailsById(Long id);

    /**
     * 根据父级"类别"查询其所有子级"类别"
     *
     * @param parentId 父级"类别"的id
     * @return 此父级"类别"下的所有子级"类别"的列表
     */
    List<CategorySimpleListItemVO> listByParentId(Long parentId);

    /**
     * 预热类别数据的缓存
     */
    void preloadCache();

    //    1. 根据类别的id，禁用对应的类别
//- 类别不存在时抛出异常
//- 类别已禁用时抛出异常
    public JsonResult disabledById(Integer id) throws ServiceException;
    //2. 根据类别的id，启用对应的类别
//- 类别不存在时抛出异常
//- 类别已启用时抛出异常
    public JsonResult stateById(Integer id) throws ServiceException;
    //3. 根据类别的id，隐藏（调整is_display的值）对应的类别（调整is_display的值）
//            - 类别不存在时抛出异常
//- 类别已隐藏时抛出异常
    public JsonResult concealById(Integer id) throws ServiceException;
    //4. 根据类别的id，显示（调整is_display的值）对应的类别
//- 类别不存在时抛出异常
//- 类别已显示时抛出异常
    public JsonResult showById(Integer id) throws ServiceException;
    //5. 根据类别的id，删除对应的类别
//- 类别不存在时抛出异常
//- 类别存在子级类别时抛出异常
//- 如果删除的类别是父级类别中的最后一个类别，删除成功后，父级类别的is_parent需更新为0）
    public JsonResult deleteById(Integer id) throws ServiceException;
    // 6. 根据类别的id，修改对应的类别的基本信息，包括：名称、关键字、图标、排序序号
//- 类别不存在时抛出异常
//- 新名称已经被占用时抛出异常
    public JsonResult updataById(CategorySimpleListItemVO categorySimpleListItemVO) throws ServiceException;
    //7. 重建缓存
//    当请求 /categories/cache/rebuild 路径时，将重建Redis缓存中的所有类别数据（与缓存预热相同的处理）
    public JsonResult onRedis(Integer id);
}
